package cn.com.surker.util;

import java.math.BigDecimal;

/**
 * @author luotao
 * @date 2022/1/10
 */
public class MathUtils {

	/**
	 * 保留两位小数处理
	 * @param num
	 * @return
	 */
	public static Double decimal(Double num){
		if(num == null){
			return 0d;
		}
		// 将double类型转为BigDecimal
		BigDecimal bigDecimal = BigDecimal.valueOf(num);
		// 保留两位小数,并且四舍五入
		return bigDecimal.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue();
	}

	public static Double decimal(Double num,Integer newScale){
		if(num == null){
			return 0d;
		}
		if(newScale == null || newScale < 0){
			newScale = 2;
		}
		// 将double类型转为BigDecimal
		BigDecimal bigDecimal = BigDecimal.valueOf(num);
		// 保留两位小数,并且四舍五入
		return bigDecimal.setScale(newScale,BigDecimal.ROUND_HALF_UP).doubleValue();
	}

	/**
	 * 浮点数相加
	 * @param a
	 * @param b
	 * @return
	 */
	public static Double add(Double a,Double b){
		if(a == null){
			a = 0d;
		}
		if(b == null){
			b = 0d;
		}
		BigDecimal ba = BigDecimal.valueOf(a);
		BigDecimal bb = BigDecimal.valueOf(b);
		BigDecimal add = ba.add(bb);
		return add.doubleValue();
	}

	/**
	 * 整形相加
	 * @param a
	 * @param b
	 * @return
	 */
	public static Integer add(Integer a,Integer b){
		if(a == null){
			a = 0;
		}
		if(b == null){
			b = 0;
		}
		BigDecimal ba = BigDecimal.valueOf(a);
		BigDecimal bb = BigDecimal.valueOf(b);
		BigDecimal add = ba.add(bb);
		return add.intValue();
	}


	public static Long add(Long a,Long b){
		if(a == null){
			a = 0l;
		}
		if(b == null){
			b = 0l;
		}
		BigDecimal ba = BigDecimal.valueOf(a);
		BigDecimal bb = BigDecimal.valueOf(b);
		BigDecimal add = ba.add(bb);
		return add.longValue();
	}

	/**
	 * 浮点类型相除,默认保留两位小数
	 * @param a			分母
	 * @param b			分子
	 * @return
	 */
	public static Double divide(Double a,Double b){
		if(a == null){
			a = 0d;
		}
		if (b == null) {
			b = 0d;
		}
		BigDecimal ba = BigDecimal.valueOf(a);
		BigDecimal bb = BigDecimal.valueOf(b);
		BigDecimal d = ba.divide(bb,2,BigDecimal.ROUND_HALF_UP);
		return d.doubleValue();
	}

	/**
	 * 浮点类型相除
	 * @param a				分母
	 * @param b				分子
	 * @param scale			保留小数位数
	 * @return
	 */
	public static Double divide(Double a,Double b,int scale){
		if (a == null) {
			a = 0d;
		}
		if (b == null) {
			b = 0d;
		}
		BigDecimal ba = BigDecimal.valueOf(a);
		BigDecimal bb = BigDecimal.valueOf(b);
		BigDecimal d = ba.divide(bb,scale,BigDecimal.ROUND_HALF_UP);
		return d.doubleValue();
	}

	/**
	 * 减 a - b
	 * @param a
	 * @param b
	 * @return
	 */
	public static Double subtract(Double a,Double b){
		if(a == null){
			a = 0d;
		}
		if(b == null){
			b = 0d;
		}
		BigDecimal ba = BigDecimal.valueOf(a);
		BigDecimal bb = BigDecimal.valueOf(b);
		BigDecimal d = ba.subtract(bb);
		return d.doubleValue();
	}

	public static Double multiply(Double a,Double b){
		if(a == null){
			a = 0d;
		}
		if(b == null){
			b = 0d;
		}
		BigDecimal ba = BigDecimal.valueOf(a);
		BigDecimal bb = BigDecimal.valueOf(b);
		BigDecimal multiply = ba.multiply(bb);
		return multiply.doubleValue();
	}

	public static Double multiply(BigDecimal a,BigDecimal b){
		if(a == null){
			a = BigDecimal.valueOf(0);
		}
		if(b == null){
			b = BigDecimal.valueOf(0);
		}
		BigDecimal multiply = a.multiply(b);
		//	默认保留2位小数
		multiply.setScale(2,BigDecimal.ROUND_HALF_UP);
		return multiply.doubleValue();
	}

	/**
	 * 将科学技术法转换为普通显示数字
	 * @param receivables
	 * @return
	 */
	public static String toPlainString(Double receivables) {
		if(receivables == null){
			return "";
		}
		BigDecimal bd = BigDecimal.valueOf(receivables);
		String s = bd.toPlainString();
		return s;
	}

	/**
	 * 判断一个double数是否为0(当这个值为null的时候,表示也为0)
	 *
	 * @param sendOutStere
	 * @return
	 */
	public static boolean isZero(Double sendOutStere) {
		if (sendOutStere == null) {
			return true;
		}
		if (BigDecimal.valueOf(sendOutStere).compareTo(BigDecimal.ZERO) == 0) {
			return true;
		}
		return false;
	}
}
